home *** CD-ROM | disk | FTP | other *** search
- #include "deldir.h"
-
- /* macros to check to see if parameter block points to a file or to a directory */
-
- #define ISDIRECTORY(pb) ((pb.dirInfo.ioFlAttrib & 0x10) != 0)
- #define ISFILE(pb) ((pb.dirInfo.ioFlAttrib & 0x10) == 0)
-
-
- /* DeleteDirectory will delete a subdirectory from a Mac volume,
- including any nested directories. It should work in AppleShare
- as well as normal envirionments. It takes the volume reference
- number and the directory ID of the directory to delete. */
-
- OSErr DeleteDirectory(short vRefNum,long dirID)
- {
- CInfoPBRec pBlock; /* parameter block used to access files */
- Str255 fName; /* filename storage */
- OSErr err; /* error check var */
- short numFiles,index; /* number of files/index to files */
-
- /* set-up paramter block to get # of files/folders */
-
- pBlock.dirInfo.ioVRefNum = vRefNum;
- pBlock.dirInfo.ioDrDirID = dirID;
- pBlock.dirInfo.ioNamePtr = fName;
- pBlock.dirInfo.ioFDirIndex = -1; /* get directory id of parent */
-
- /* get number of files/folders in root to remove */
-
- err = PBGetCatInfo(&pBlock,false);
- if (err!=noErr)
- return err;
-
- numFiles = pBlock.dirInfo.ioDrNmFls;
-
- /* index through files/folders, removing them */
-
- index = 1;
- while (index <= numFiles) {
- pBlock.dirInfo.ioDrDirID = dirID;
- pBlock.dirInfo.ioFDirIndex = index;
- err = PBGetCatInfo(&pBlock,false);
- if (err==noErr) {
- if ISDIRECTORY(pBlock)
- err = DeleteDirectory(vRefNum, pBlock.dirInfo.ioDrDirID);
- else
- err = DeleteFile(vRefNum,dirID,pBlock.dirInfo.ioNamePtr);
- }
- if (err==noErr)
- numFiles--; /* decrement # of files if delete successful */
- else
- index++; /* increment file index if delete failed */
- }
-
- /* delete top directory of tree */
-
- pBlock.dirInfo.ioFDirIndex = -1;
- pBlock.dirInfo.ioDrDirID = dirID;
- err = PBGetCatInfo(&pBlock,false);
- if (err!=noErr)
- return err;
- pBlock.dirInfo.ioDrDirID = pBlock.dirInfo.ioDrParID;
-
- err = PBHDelete(&pBlock,false);
- return err;
- }
-
-
- /* DeleteFile is called by the above to erase a single file.
- It takes the volume reference number, directory ID, and
- filename of the file to delete. The result of the
- delete is returned as the function result. */
-
- OSErr DeleteFile(short vRefNum,long dirID,StringPtr fName)
- {
- HParamBlockRec pBlock;
- OSErr err;
-
- pBlock.ioParam.ioVRefNum = vRefNum;
- pBlock.ioParam.ioNamePtr = fName;
- pBlock.fileParam.ioDirID = dirID;
-
- err = PBHDelete(&pBlock,false);
-
- return err;
- }